import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * @User: vitobo
 * @Date: 2024-05-30
 * @Description: 集合,复杂度,泛型
 *
 * 集合:
 *      也称为 容器,集合类
 *
 *  数据结构:
 *      数据+结构,描述和组织数据的方式(栈, 顺序表, 链表, 二叉树, 数组)
 *
 *  算法:
 *      一系列的计算步骤,将输入数据转换为输出结果
 *
 *  时间复杂度:(大O的渐进表示法)
 *      算法中的基本操作的执行次数
 *  空间复杂度:
 *      算法在运行过程中,临时占用存储空间大小的量度
 *  <复杂度的计算 需要通过结合代码的思想来计算>
 *
 *  泛型
 *      其实就是 对类型进行参数化
 *      class MyArray<T> <T>:占位符,当前类是一个泛型类
 *
 *      泛型存在的两个最大的意义:
 *      泛型主要是编译时期的一种机制, 这种机制也叫: 擦除机制
 *      这两步都是在编译的时候进行检查和转换
 *      1.存放元素的时候,会进行类型的检查
 *      2.取出元素的时候,会自动进行类型转换(不需要再进行类型的强转了)
 *
 *
 *      一个泛型类的参数列表可以指定多个类型
 *      <>当中一定必须是类类型, 不能是基本类型
 *
 *       
 *  4.裸类型
 *      泛型是在jdk1.5之后引入的, 类类型之后不加<>
 *      泛型 是在编译时自动进行类型检查和转换
 *
 *  5.泛型是如何编译的?
 *      擦除机制: 在编译的时候,把T都擦除成了Object, 编译的时候,会根据类型自动进行检查和转换
 *
 *  6.泛型上界:
 *      T extends Number: T是Number的子类或者Number本身. 擦除成了Number
 *      泛型没有下界
 *
 *
 *  7.泛型方法:
 *     static <T> void func(){}
 *
 *  8.通配符
 *      ?
 *      ? extends 类: 设置通配符上限
 *      < ? extends Number> 可以传入的实参类型是Number或者Number的子类
 *
 *
 *      ? super 类: 设置通配符下限
 *      < ? super Integer> 可以传入的实参类型是Integer或者Integer的父类类型
 *      通配符的下界,不能进行读取数据,只能写入数据
 *
 *  9.包装类
 *      基本数据类型 对应的 类类型-->包装类
 *
 *      装箱（装包）：将基本数据类型变成对应的包装类型！
 *          自动装箱，手动装箱
 *
 *      拆箱（拆包）：把包装类型变成基本数据类型
 *
 *
 */


// <T> 占位符: 当前类是一个泛型类
class MyArray<T> {
    //public T[] obj2 = new T[10];
    public T[] obj ;

    public MyArray() {
    }

    //反射相关 【了解】
    public MyArray(Class<T> clazz, int capacity) {
        obj = (T[]) Array.newInstance(clazz, capacity);
    }

    public void setVal(int pos,T val) {
        obj[pos] = val;
    }

    public T getPos(int pos) {
        return obj[pos];
    }
    public T[] getObj2() {
        return obj;
    }
}

public class Test1 {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>(Integer.class,10);
        Integer[] tmp = myArray.getObj2();

    }

    public static void main1(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.setVal(0,10);
        myArray.setVal(1,2);
        myArray.setVal(2,6);
        int a  =  myArray.getPos(1);

        MyArray<String> myArray2 = new MyArray<>();
        myArray2.setVal(0,"hello");
        myArray2.setVal(1,"hello2");
        String str = myArray2.getPos(0);
    }
}
